Como generar señales PWM (Pulse Width Modulation) con un microcontrolador AVR.
El modo PWM nos permite generar señales cuadradas usando el microcontrolador, esto nos puede servir para controlar el comportamiento de ciertos componentes, como controlar el brillo de un led o la velocidad de un motor.
El funcionamiento es muy parecido al modo CTC, solo que cuando se llega al valor de comparación y se cambia el estado de la salida de un pin en vez de reiniciarse el contador en ese momento el contador sigue contando hasta el valor maximo (255), cuando el contador se reinicia el pin vuelve al estado inicial según el modo configurado (desactivado en non-inverted, activado en inverted)
De esta manera el modo PWM cuenta siempre de 0 a 255 y cuando llega al valor de comparación cambia el estado del pin, si por ejemplo ponemos el valor de comparación en 25 esto hará que la señal esté activa un 10% del tiempo (si tenemos un led conectado alumbrará al 10% de su capacidad).
NOTA: en el Timer1 podemos activar el modo 14 (WGM13, WGM12 y WGM11), que es Fast PWM, pero en vez de contar hasta 255 cuenta hasta el valor de ICR1 (el máximo valor de ICR1 es 65535),
En el Atmega168pa tenemos dos pines por cada uno de los timers (6 pines en total) que nos permiten generar señales PWM:
Para utilizar el modo PWM (Fast PWM) necesitamos lo siguiente:
TCCR1A |= (1 << WGM10) | (1 << WGM12);
TCCR1B |= (1 << CS11);
El valor del preescaler es muy importante ya que determinará cuanto de rapido oscilará la señal, para controlar el brillo de un led por ejemplo necesitaremos una oscilación bastante rapida si no queremos verlo parpadear.
TCCR1A |= (1 << COM1A1);
Podemos consultar en el datasheet todos los demas puertos y como activar el modo non-inverted o inverted, la única diferencia entre estos dos modos es como se inicia el pin, desactivado o activado.
OCR1A = 127;
Una vez hechas todas estás configuraciones se generará una señal constante en el pin OC1A al 50%, si tenemos conectado un led en este pin veremos como alumbra a la mitad en comparación con una señal de salida continua.
AVR | microcontrolador | PWM